package org.ladybug.service.impl;

import java.sql.Date;

import org.ladybug.dao.persistence.InfoUtente;
import org.ladybug.dao.persistence.Ruolo;
import org.ladybug.dao.persistence.RuoloUtente;
import org.ladybug.dao.persistence.Utente;
import org.ladybug.service.CommandService;
import org.ladybug.service.admin.AdminService;
import org.ladybug.web.controller.model.ModelUtente;
import org.springframework.security.providers.dao.SaltSource;
import org.springframework.security.providers.encoding.PasswordEncoder;
import org.springframework.validation.BindException;

public class UserCommandService implements CommandService {
	/**
	 * Nome che viene dato al ruolo di amministratore dell'applicativo
	 */
	private String administratorRoleName = "ADMINISTRATOR";
	private PasswordEncoder passwordEncoder;
	private SaltSource saltSource;

	private AdminService adminService;

	public void delete(Object command, BindException errors) throws Exception {

	}

	public void insertOrUpdate(Object command, BindException errors)
			throws Exception {
		ModelUtente uc = (ModelUtente) command;
		Utente utente = new Utente();
		utente.setNickname(uc.getNickname());

		utente.setPassword(uc.getPassword());
		// TODO mettere il settaggio della data direttamente nel file hibernate.
		utente.setDataInizio(new Date(System.currentTimeMillis()));
		InfoUtente infoUtente = new InfoUtente();
		infoUtente.setCognome(uc.getCognome());
		infoUtente.setNome(uc.getNome());
		infoUtente.setDataNascita(uc.getDataNascita());
		infoUtente.setEmail(uc.getEmail());
		infoUtente.setUtente(utente);

		adminService.saveOrUpdate(infoUtente);
		if (uc.isAdministrator()) {
			Ruolo r = new Ruolo();
			r.setDescrizione(getAdministratorRoleName());
			r = adminService.findRuoloByName(r);
			RuoloUtente ruoloUtente = new RuoloUtente();
			ruoloUtente.setRuolo(r);
			ruoloUtente.setUtente(utente);
			adminService.saveOrUpdate(ruoloUtente);
		} 
	}

	// ---------------------------- setters and getters

	public String getAdministratorRoleName() {
		return administratorRoleName;
	}

	public void setAdministratorRoleName(String administratorRoleName) {
		this.administratorRoleName = administratorRoleName;
	}

	public AdminService getAdminService() {
		return adminService;
	}

	public void setAdminService(AdminService adminService) {
		this.adminService = adminService;
	}

	public PasswordEncoder getPasswordEncoder() {
		return passwordEncoder;
	}

	public void setPasswordEncoder(PasswordEncoder passwordEncoder) {
		this.passwordEncoder = passwordEncoder;
	}

	public SaltSource getSaltSource() {
		return saltSource;
	}

	public void setSaltSource(SaltSource saltSource) {
		this.saltSource = saltSource;
	}

}
